package com.normal.zbase.impl.tools.utils;

import android.text.TextUtils;

import androidx.collection.ArrayMap;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.normal.zbase.impl.tools.extend.Logs;

import org.json.JSONObject;

import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.Map;

/**
 * 三疯
 * *************************
 * <p>
 * *************************
 */
public class JsonUtils {

    private static Gson mGson = null;

    /**
     * @param jsonObject 需要转换成map的json数据源
     * @return 返回转换之后的map集合, 注意返回的集合类型是<String, String>
     */
    public static Map<String, String> convertToMap(JSONObject jsonObject) {
        Map<String, String> map = new ArrayMap<>();
        try {
            Iterator<String> keysItr = jsonObject.keys();
            while (keysItr.hasNext()) {
                String key = keysItr.next();
                init();
                // 多层嵌套的数据结构在此只转换成了普通的Str
                String value = mGson.toJson(jsonObject.get(key));
                map.put(key, value);
            }
        } catch (Exception e) {
            Logs.getInstance().logger().error("JsonObject Convert To Map failed", e);
        }
        return map;
    }

    /**
     * @param jsonStr     需要转换的数据str
     * @param entityClass 对应需要转换成的class类类型
     * @param <T>         类型定义
     * @return 具体转换之后的Entity数据结构
     */
    public static <T> T jsonToEntity(String jsonStr, Class<T> entityClass) {
        if (TextUtils.isEmpty(jsonStr)) {
            return null;
        }
        T targetEntity = null;
        try {
            init();
            targetEntity = mGson.fromJson(jsonStr, entityClass);
        } catch (Exception e) {
            Logs.getInstance().logger().error("json转换成:" + entityClass.getSimpleName() + "异常", e);
        }
        return targetEntity;
    }

    /**
     * 兼容问题，原有的JsonUtils#fromJson()有这样的方法
     *
     * @param jsonStr     数据源
     * @param entityClass 数据类型
     * @param <T>         数据类型
     * @return 转换之后的数据结构
     */
    public static <T> T fromJson(String jsonStr, Class<T> entityClass) {
        return jsonToEntity(jsonStr, entityClass);
    }

    /**
     * @param jsonStr 数据源
     * @param type    数据类型
     * @param <T>     转换的数据结构定义
     * @return 数据
     */
    public static <T> T fromJson(String jsonStr, Type type) {
        if (TextUtils.isEmpty(jsonStr)) {
            return null;
        }
        T targetEntity = null;
        try {
            init();
            targetEntity = mGson.fromJson(jsonStr, type);
        } catch (Exception e) {
            Logs.getInstance().logger().error("json转换成:" + type + "异常", e);
        }
        return targetEntity;
    }

    /**
     * @param object 数据源
     * @return 转换之后的字符
     */
    public static String toJson(Object object) {
        try {
            init();
            return mGson.toJson(object);
        } catch (Exception e) {
            return "";
        }
    }

    public static Gson getJson() {
        init();
        return mGson;
    }

    private static void init() {
        if (mGson == null)
            // 去除对于特殊符号的转译的异常处理
            mGson = new GsonBuilder().disableHtmlEscaping().create();
    }

}
